﻿using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace Kyoh.Lib.Text
{
    /// <summary>ワイルドカードを入力文字列に繰り返し適用したときに、パターンに一致した一連の対象を表します。</summary>
    public class WildMatchCollection : IEnumerable<WildMatch>
    {
        private readonly MatchCollection _matchCollection;

        internal WildMatchCollection(MatchCollection matchCollection)
        {
            _matchCollection = matchCollection;
        }

        /// <summary>一致の数を取得します。</summary>
        /// <returns>一致の数。</returns>
        public int Count
        {
            get { return _matchCollection.Count; }
        }

        /// <summary>コレクションが読み取り専用かどうかを示す値を取得します。</summary>
        /// <returns>このプロパティの値は常に <c>true</c> です。</returns>
        public bool IsReadOnly
        {
            get { return true; }
        }

        /// <summary>コレクションへのアクセスが同期されている (スレッド セーフである) かどうかを示す値を取得します。</summary>
        /// <returns>このプロパティの値は常に <c>false</c> です。</returns>
        public bool IsSynchronized
        {
            get { return false; }
        }

        /// <summary>コレクションへのアクセスを同期するために使用できるオブジェクトを取得します。</summary>
        /// <returns>コレクションへのアクセスを同期するために使用できるオブジェクト。このプロパティは常にオブジェクト自体を返します。</returns>
        public object SyncRoot
        {
            get { return this; }
        }

        /// <summary>コレクションの個別のメンバを取得します。</summary>
        /// <param name="i"><see cref="WildMatch"/> コレクション内のインデックス。</param>
        /// <exception cref="System.ArgumentOutOfRangeException"><paramref name="i"/> が <c>0</c> 未満、または <see cref="WildMatchCollection.Count"/> 以上です。</exception>
        /// <returns>コレクション内の <paramref name="i"/> の位置にあるキャプチャされた部分文字列。</returns>
        public virtual WildMatch this[int i]
        {
            get { return new WildMatch(_matchCollection[i]); }
        }

        /// <summary><see cref="WildMatchCollection.this[System.Int32]"/> と同じ順序で列挙子を提供します。</summary>
        /// <returns><see cref="WildMatchCollection"/> 内にあるすべての <see cref="WildMatch"/> オブジェクトを保持する <see cref="System.Collections.IEnumerator"/> オブジェクト。</returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            for (int i = 0; i < Count; i++)
                yield return this[i];
        }

        /// <summary><see cref="WildMatchCollection.this[System.Int32]"/> と同じ順序で列挙子を提供します。</summary>
        /// <returns><see cref="WildMatchCollection"/> 内にあるすべての <see cref="WildMatch"/> オブジェクトを保持する <see cref="System.Collections.Generic.IEnumerator{T}"/> オブジェクト。</returns>
        public IEnumerator<WildMatch> GetEnumerator()
        {
            for (int i = 0; i < Count; i++)
                yield return this[i];
        }
    }
}
